home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DJSRC106.ARJ / DJTARX.C < prev    next >
C/C++ Source or Header  |  1991-03-24  |  4KB  |  173 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. FILE *change_file;
  8.  
  9. main(int argc, char **argv)
  10. {
  11.   int i;
  12.   for (i=1; i < argc; i++)
  13.     tarread(argv[i]);
  14.   change_file = fopen("/tarchange.lst", "w");
  15.   dump_changes();
  16.   fclose(change_file);
  17. }
  18.  
  19. /*------------------------------------------------------------------------*/
  20.  
  21. typedef struct CHANGE {
  22.   struct CHANGE *next;
  23.   char *old;
  24.   char *new;
  25.   int isdir; /* 0=file, 1=dir, 2=skip */
  26. } CHANGE;
  27.  
  28. CHANGE *change_root = 0;
  29.  
  30. dump_changes()
  31. {
  32.   CHANGE *c;
  33.   for (c=change_root; c; c=c->next)
  34.     fprintf(change_file, "%s -> %s\n", c->old, c->new);
  35. }
  36.  
  37. int change(char *fname, char *problem, int isadir)
  38. {
  39.   CHANGE *ch;
  40.   char new[200];
  41.   char *pos;
  42.  
  43.   for (ch=change_root; ch; ch = ch->next)
  44.     if ((strncmp(fname, ch->old, strlen(ch->old)) == 0) && ch->isdir)
  45.     {
  46.       if (ch->isdir == 2)
  47.       {
  48.         printf("  [ skipping %s ]\n", fname);
  49.         return 0;
  50.       }
  51. /*      printf("  [ changing %s to ", fname); */
  52.       sprintf(new, "%s%s", ch->new, fname+strlen(ch->old));
  53.       strcpy(fname, new);
  54. /*      printf("%s ]\n", fname); */
  55.       return 1;
  56.     }
  57.   printf("  %s %s\n  new name : ", problem, fname);
  58.   gets(new);
  59.   if ((strcmp(new, "") == 0) && (isadir == 2))
  60.     return 0;
  61.   if (isadir) isadir=1;
  62.   ch = (CHANGE *)malloc(sizeof(CHANGE));
  63.   ch->next = change_root;
  64.   change_root = ch;
  65.   ch->old = strdup(fname);
  66.   pos = strrchr(fname, '/');
  67.   if (pos && (strchr(new, '/') == 0))
  68.   {
  69.     ch->new = (char *)malloc(strlen(new) + (pos-fname) + 2);
  70.     *pos = 0;
  71.     sprintf(ch->new, "%s/%s", fname, new);
  72.   }
  73.   else
  74.     ch->new = strdup(new);
  75.   ch->isdir = isadir;
  76.   strcpy(fname, ch->new);
  77.   if (new[0] == 0)
  78.   {
  79.     ch->isdir = 2;
  80.     return 0;
  81.   }
  82.   return 1;
  83. }
  84.  
  85. /*------------------------------------------------------------------------*/
  86.  
  87. typedef struct {
  88.   char name[100];
  89.   char operm[8];
  90.   char ouid[8];
  91.   char ogid[8];
  92.   char osize[11];
  93.   char otime[12];
  94.   char ocsum[8];
  95.   char flags[1];
  96.   char filler[356];
  97. } TARREC;
  98.  
  99. char buf[512];
  100.  
  101. tarread(char *fname)
  102. {
  103.   TARREC header;
  104.   int f, r;
  105.   long perm, uid, gid, size, time, csum;
  106.   int dsize;
  107.   f = open(fname, O_RDONLY|O_BINARY);
  108.  
  109.   while (1)
  110.   {
  111.     if (read(f, &header, 512) < sizeof(header))
  112.       break;
  113.     if (header.name[0] == 0)
  114.       break;
  115.     sscanf(header.operm, "%lo", &perm);
  116.     sscanf(header.ouid, "%lo", &uid);
  117.     sscanf(header.ogid, "%lo", &gid);
  118.     sscanf(header.osize, "%lo", &size);
  119.     sscanf(header.otime, "%lo", &time);
  120.     printf("%6lo %02x %12ld %s\n", perm, header.flags[0], size, header.name);
  121.     if (header.name[strlen(header.name)-1] == '/')
  122.     {
  123.       header.name[strlen(header.name)-1] = 0;
  124.       do {
  125.         printf("Making directory %s\n", header.name);
  126.         r = mkdir(header.name
  127. #ifdef GNUDOS
  128.     ,0
  129. #endif
  130.         );
  131.         if (r && (errno==EACCES))
  132.         {
  133.           change(header.name, "Duplicate directory name", 2);
  134.           break;
  135.         }
  136.         if (r)
  137.           r = change(header.name, "Unable to create directory", 1);
  138.       } while (r);
  139.     }
  140.     else
  141.     {
  142.     open_file:
  143.       r = open(header.name, O_WRONLY|O_BINARY|O_CREAT|O_EXCL, S_IWRITE|S_IREAD);
  144.       if (r < 0)
  145.         if (change(header.name, "Cannot exclusively open file", 0))
  146.           goto open_file;
  147.         else
  148.         {
  149.           lseek(f, (size+511) & ~511, 1);
  150.         }
  151.       else
  152.       {
  153.         while (size)
  154.         {
  155.           if (size < 512)
  156.             dsize = size;
  157.           else
  158.             dsize = 512;
  159.           read(f, buf, 512);
  160.           if (write(r, buf, dsize) < dsize)
  161.           {
  162.             printf("Out of disk space\n");
  163.             exit(1);
  164.           }
  165.           size -= dsize;
  166.         }
  167.         close(r);
  168.       }
  169.     }
  170.   }
  171.   close(f);
  172. }
  173.